package com.jmu.edu.IMApplication.utils;

import java.io.File;
import java.util.Collection;
import java.util.List;

import cn.jpush.im.android.api.JMessageClient;
import cn.jpush.im.android.api.callback.CreateGroupCallback;
import cn.jpush.im.android.api.callback.GetGroupIDListCallback;
import cn.jpush.im.android.api.callback.GetGroupInfoCallback;
import cn.jpush.im.android.api.callback.GetGroupInfoListCallback;
import cn.jpush.im.android.api.callback.RequestCallback;
import cn.jpush.im.android.api.event.GroupApprovalEvent;
import cn.jpush.im.android.api.model.GroupBasicInfo;
import cn.jpush.im.android.api.model.GroupMemberInfo;
import cn.jpush.im.api.BasicCallback;

/**
 * 私有群组无法申请加入，只能通过群内成员邀请加入
 * 公开群组可通过获取公开群组列表获取
 * 公开群组可通过发起加入申请，群主或管理员审核的方式加入
 * 公开群组群主或管理员直接邀请即可加入，群成员邀请需要群主或管理员审批
 */
public class GroupUtils {

    /**
     * 创建私有群组
     * @param groupName 群名
     * @param groupDesc 群描述
     * @param callback
     */
    public static void createGroup(String groupName, String groupDesc, CreateGroupCallback callback)
    {
        JMessageClient.createGroup(groupName, groupDesc, callback);
    }

    /**
     * 创建私有群组
     * @param groupName 群名
     * @param groupDesc 群描述
     * @param groupAvatarFile 群头像文件
     * @param format 头像文件扩展名，不要包括“.”
     * @param callback 响应码 响应信息 群组id（responseCode为0时）
     */
    public static void createGroup(String groupName, String groupDesc, File groupAvatarFile, String format, CreateGroupCallback callback)
    {
        JMessageClient.createGroup(groupName, groupDesc, groupAvatarFile, format, callback);
    }

    /**
     * 创建公开群组
     * @param groupName
     * @param groupDesc
     * @param callback
     */
    public static void createPublicGroup(String groupName, String groupDesc, CreateGroupCallback callback)
    {
        JMessageClient.createPublicGroup(groupName, groupDesc, callback);
    }

    /**
     * 创建公开群组
     * @param groupName 群名
     * @param groupDesc 群描述
     * @param groupAvatarFile 群头像文件
     * @param format 头像文件扩展名，不要包括“.”
     * @param callback
     */
    public static void createPublicGroup(String groupName, String groupDesc, File groupAvatarFile, String format, CreateGroupCallback callback)
    {
        JMessageClient.createPublicGroup(groupName, groupDesc, groupAvatarFile, format, callback);
    }

    /**
     * 解散群组，只有群主有权限解散
     * 解散后所有成员收到Message，type是group_dissolved
     * @param groupID
     * @param callback
     */
    public static void dissolveGroup(long groupID, BasicCallback callback)
    {
        JMessageClient.adminDissolveGroup(groupID, callback);
    }

    /**
     * 获取当前用户加入的群组列表
     * @param callback 状态码 状态描述 群组id的List
     */
    public static void getGroupIdList(GetGroupIDListCallback callback)
    {
        JMessageClient.getGroupIDList(callback);
    }

    /**
     * 获取本app所属的所有公开群组基本信息
     * @param start 起始位置
     * @param count 获取个数
     * @param callback 状态码，状态描述，群组信息的List
     */
    public static void getPublicGroupList(int start, int count, RequestCallback<List<GroupBasicInfo>> callback)
    {
        JMessageClient.getPublicGroupListByApp("", start, count, callback);
    }

    /**
     * 获取群组信息
     * @param groupId
     * @param callback
     */
    public static void getGroupInfo(long groupId, GetGroupInfoCallback callback)
    {
        JMessageClient.getGroupInfo(groupId, callback);
    }

    /**
     * 获取群组成员列表
     * @param groupID
     * @param callback 状态码，状态描述，群组成员GroupMemberInfo的List
     * 群成员信息实体类 GroupMemberInfo详见https://docs.jiguang.cn/jmessage/client/android_sdk/group/
     */
    public static void getGroupMembers(long groupID, RequestCallback<List<GroupMemberInfo>> callback)
    {
        JMessageClient.getGroupMembers(groupID, callback);
    }

    /**
     * 添加群组成员
     * @param groupID 待加群的群组id
     * @param userNameList 要添加的群组成员列表
     * @param callback
     */
    public static void addGroupMembers(long groupID, List<String> userNameList, BasicCallback callback)
    {
        JMessageClient.addGroupMembers(groupID, "", userNameList, callback);
    }

    /**
     * 附带reason的添加群组成员，本方法只对公开群组有效
     * @param groupID
     * @param userNameList
     * @param reason 邀请入群的理由
     * @param callback
     */
    public static void addGroupMembers(long groupID, List<String> userNameList, String reason, BasicCallback callback)
    {
        JMessageClient.addGroupMembers(groupID, "", userNameList, reason, callback);
    }

    /**
     * 移除组成员
     * @param groupId
     * @param usernameList
     * @param callback
     */
    public static void removeGroupMembers(long groupId, List<String> usernameList, BasicCallback callback)
    {
        JMessageClient.removeGroupMembers(groupId, "", usernameList, callback);
    }

    /**
     * 退出群组
     * @param groupId
     * @param callback
     */
    public static void exitGroup(long groupId, BasicCallback callback)
    {
        JMessageClient.exitGroup(groupId, callback);
    }

    /**
     * 获取当前用户的群屏蔽列表
     * @param callback
     */
    public static void getBlockedGroupList(GetGroupInfoListCallback callback)
    {
        JMessageClient.getBlockedGroupsList(callback);
    }

    /**
     * 申请加入群组，只对公开群组有效
     * @param groupID
     * @param reason 可为null
     * @param callback
     */
    public static void applyJoinGroup(long groupID, String reason, BasicCallback callback)
    {
        JMessageClient.applyJoinGroup(groupID, reason, callback);
    }

    /**
     * 批量同意审批事件内的成员进群
     * 操作成功后群内所有成员包括审批人会收到一个群成员变化的EventNotification
     * @param events 待处理的事件对象集合
     * @param callback
     */
    public static void acceptGroupApprovalInBatch(Collection<GroupApprovalEvent> events, BasicCallback callback)
    {
        GroupApprovalEvent.acceptGroupApprovalInBatch(events, false, callback);
    }
}
